home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / var / lib / defoma / scripts / fontconfig.defoma next >
Text File  |  2009-10-28  |  5KB  |  241 lines

  1. # -*- perl -*-
  2. # Defoma configuration script for fontconfig
  3. # Copyright ┬⌐ 2003 Angus Lees <gus@debian.org>
  4. # This file is hereby placed into the public domain.
  5.  
  6. @ACCEPT_CATEGORIES = qw(type1 truetype cid);
  7. # .. and any other categories supported by freetype
  8.  
  9. package fontconfig;
  10.  
  11. use Debian::Defoma::Common;
  12. use Debian::Defoma::Id;
  13. use Debian::Defoma::Subst;
  14.  
  15. use strict;
  16. use warnings;
  17.  
  18. my $PkgDir = "$ROOTDIR/fontconfig.d";
  19. my ($Id, $Sb);
  20.  
  21. my %UpdatedDirectories = ();
  22.  
  23. sub init {
  24.   $Id ||= defoma_id_open_cache() or return 1;
  25.   $Sb ||= defoma_subst_open(rulename => 'fontconfig',
  26.                 threshold => 70,
  27.                 idobject => $Id) or return 1;
  28.  
  29.   return 0;
  30. }
  31.  
  32. sub register {
  33.   my $font = shift;
  34.   my $hints = parse_hints_start(@_);
  35.  
  36.   return 1 unless $hints->{FontName};
  37.  
  38.   my $priority = $hints->{Priority} || 20;
  39.   my ($fontname) = split / +/, $hints->{FontName};
  40.   my @alias = split / +/, $hints->{Alias} if $hints->{Alias};
  41.  
  42.   defoma_id_register($Id, type => 'real', font => $font,
  43.              id => $fontname, priority => $priority,
  44.              hints => join(' ', @_));
  45.  
  46.   foreach my $alias (@alias) {
  47.     defoma_id_register($Id, type => 'alias', font => $font,
  48.                id => $alias, priority => $priority,
  49.                origin => $fontname);
  50.   }
  51.  
  52.   defoma_subst_register($Sb, $font, $fontname);
  53.  
  54.   return 0;
  55. }
  56.  
  57. sub unregister {
  58.   my $font = shift;
  59.   defoma_subst_unregister($Sb, $font);
  60.   defoma_id_unregister($Id, type => 'alias', font => $font);
  61.   defoma_id_unregister($Id, type => 'real', font => $font);
  62.   return 0;
  63. }
  64.  
  65. sub dirname {
  66.    my $path = shift;
  67.  
  68.    $path =~ s/\/[^\/]*$//;
  69.    return $path;
  70. }
  71.  
  72. sub do_install_real {
  73.   my $font = shift;
  74.   my $id = shift;
  75.  
  76.   my $dir = dirname ($font);
  77.   $UpdatedDirectories{$dir} = 1;
  78.   return 0;
  79. }
  80.  
  81. sub do_remove_real {
  82.   my $font = shift;
  83.   my $id = shift;
  84.  
  85.   my $dir = dirname ($font);
  86.   $UpdatedDirectories{$dir} = 1;
  87.  
  88.   return 0;
  89. }
  90.  
  91. sub fontconfig_dirs {
  92.    my %dirs = ();
  93.    
  94.    system ('fc-cache', '-s');
  95.    open my $file, "fc-list : file |" or return ();
  96.    while (<$file>) {
  97.        my $dir = dirname ($_);
  98.     if (!exists $dirs{$dir}) {
  99.         $dirs{$dir} = 1;
  100.     }
  101.     }
  102.     close $file;
  103.     return %dirs;
  104. }
  105.  
  106. #
  107. # Clean up from old fontconfig defoma mechanism which
  108. # placed symlinks to each fontfile in the fontconfig.d directory
  109. #
  110. sub clean_oldstyle_dirs {
  111.    opendir (DIR, $PkgDir) or return 1;
  112.    my @dirs = grep { /^[^.]/ && -d "$PkgDir/$_" } readdir (DIR);
  113.    closedir DIR;
  114.    foreach my $dir (@dirs) {
  115.        my $subdir = "$PkgDir/$dir";
  116.        if (opendir (DIR, $subdir)) {
  117.       my @files = grep { /^[^.]/ && -l "$subdir/$_" } readdir (DIR);
  118.       closedir DIR;
  119.       foreach my $file (@files) {
  120.          if ( -l "$subdir/$file" ) {
  121.              unlink "$subdir/$file";
  122.          }
  123.       }
  124.       rmdir $subdir;
  125.        }
  126.    }
  127. }
  128.  
  129. sub term {
  130.   return unless $Id;
  131.  
  132.   -e "/etc/fonts/fonts.conf" or return 0;
  133.  
  134.   clean_oldstyle_dirs ();
  135.   #
  136.   # Update modified directories
  137.   #
  138.   
  139.   my @dirs = keys (%UpdatedDirectories);
  140.   if (@dirs) {
  141.       print "Updating fontconfig cache for @dirs\n";
  142.       system ("fc-cache", "-f", @dirs);
  143.       #
  144.       # make sure caches leading to new directories are updated
  145.       #
  146.       system ("fc-cache", "-s");
  147.   }
  148.   
  149.   # Empty our config file to see
  150.   # which directories are reachable without it
  151.  
  152.   open my $smash_fh, '>', "$PkgDir/fonts.conf" or return 1;
  153.   print $smash_fh <<EOF;
  154. <?xml version="1.0"?>
  155. <!DOCTYPE fontconfig SYSTEM "/etc/fonts/fonts.dtd">
  156. <!-- autogenerated by fontconfig.defoma -->
  157. <fontconfig>
  158. </fontconfig>
  159. EOF
  160.   close $smash_fh;
  161.   my %dirs = fontconfig_dirs ();
  162.  
  163.   open my $fh, '>', "$PkgDir/fonts.conf" or return 1;
  164.  
  165.   print $fh <<EOF;
  166. <?xml version="1.0"?>
  167. <!DOCTYPE fontconfig SYSTEM "/etc/fonts/fonts.dtd">
  168. <!-- autogenerated by fontconfig.defoma -->
  169. <fontconfig>
  170. EOF
  171.  
  172.   # directories
  173.   my %newdirs = ();
  174.  
  175.   foreach (defoma_id_get_font($Id, installed => type => 'SrI')) {
  176.     my $dir = dirname($Id->{e_font}->[$_]);
  177.     if (!exists $dirs{$dir} && !exists $newdirs{$dir}) {
  178.        print $fh "   <dir>$dir</dir>\n";
  179.        $newdirs{$dir} = 1;
  180.     }
  181.   }
  182.  
  183.   # aliases
  184.   foreach (defoma_id_get_font($Id, installed => type => 'SaI')) {
  185.     print $fh <<EOF
  186.    <alias>
  187.       <family>$Id->{e_id}->[$_]</family>
  188.       <accept><family>$Id->{e_depid}->[$_]</family></accept>
  189.    </alias>
  190. EOF
  191.   }
  192.  
  193.   # substituded fonts
  194.   foreach (defoma_id_get_font($Id, installed => type => 'SSI')) {
  195.     print $fh <<EOF
  196.    <alias>
  197.       <family>$Id->{e_id}->[$_]</family>
  198.       <default><family>$Id->{e_depid}->[$_]</family></default>
  199.    </alias>
  200. EOF
  201.   }
  202.  
  203.   print $fh "</fontconfig>\n";
  204.  
  205.   close $fh;
  206.  
  207.   defoma_subst_close($Sb);
  208.   defoma_id_close_cache($Id);
  209.  
  210.   system ("fc-cache", "-s");
  211.   return 0;
  212. }
  213.  
  214. sub main {
  215.   my $cmd = shift;
  216.  
  217.   if ($cmd eq 'init') {
  218.     init();
  219.   } elsif ($cmd eq 'register') {
  220.     return register(@_);
  221.   } elsif ($cmd eq 'unregister') {
  222.     return unregister(@_);
  223.   } elsif ($cmd eq 'do-install-real') {
  224.     return do_install_real(@_);
  225.   } elsif ($cmd eq 'do-remove-real') {
  226.     return do_remove_real(@_);
  227.   } elsif ($cmd eq 'term') {
  228.     return term(@_);
  229.   }
  230.  
  231.   0;
  232. }
  233.  
  234. no warnings;
  235.  
  236. *truetype  = \&main;
  237. *type1       = \&main;
  238. *cid       = \&main;
  239.  
  240. 1;
  241.